#pragma once
using namespace std;

namespace csy {
	template<class Iterator,class Ref,class Ptr>
	struct __reverse_iterator {
		typedef __reverse_iterator<Iterator, Ref, Ptr> RIterator;
		Iterator _cur;

		__reverse_iterator(Iterator it)
			:_cur(it)
		{}

		RIterator& operator++()
		{
			--_cur;
			return *this;
		}

		RIterator& operator--()
		{
			++_cur;
			return *this;
		}

		Ref operator*()
		{
			Iterator tmp = _cur;
			--tmp;
			return *tmp;
		}

		Ptr operator->()
		{
			return &(operator*());
		}

		bool operator!=(const RIterator& it)
		{
			return _cur != it._cur;
		}
	};
}

//#pragma once
//
//namespace bit
//{
//
//	template<class Iterator, class Ref, class Ptr>
//	struct __reverse_iterator
//	{
//		Iterator _cur;
//		typedef __reverse_iterator<Iterator, Ref, Ptr> RIterator;
//
//		__reverse_iterator(Iterator it)
//			:_cur(it)
//		{}
//
//		RIterator operator++()
//		{
//			--_cur;
//			return *this;
//		}
//
//		RIterator operator--()
//		{
//			++_cur;
//			return *this;
//		}
//
//		Ref operator*()
//		{
//			//return *_cur;
//			auto tmp = _cur;
//			--tmp;
//			return *tmp;
//		}
//
//		Ptr operator->()
//		{
//			//return _cur.operator->();
//			return &(operator*());
//		}
//
//		bool operator!=(const RIterator& it)
//		{
//			return _cur != it._cur;
//		}
//	};
//}